/*
 * Copyright 2016 The Netty Project
 *
 * The Netty Project licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */
package io.netty.channel;

import io.netty.util.IntSupplier;

/**
 * Select 策略接口
 * <p>
 * 提供了控制 select loop 行为的能力.
 * 例如, 如果有事件要立即处理, 一个阻塞的 select 操作可以被延迟或完全跳过.
 */
public interface SelectStrategy {

    /**
     * 表示应该进行阻塞 select
     */
    int SELECT = -1;
    /**
     * 表示应该重试 IO loop, 后续不应直接进行阻塞 select
     */
    int CONTINUE = -2;
    /**
     * 表示 IO loop 在不阻塞的情况下轮询新事件.
     */
    int BUSY_WAIT = -3;

    /**
     * 可被用于控制一个潜在的 select 调用的结果的 {@link SelectStrategy}
     *
     * @param selectSupplier The supplier with the result of a select result.
     * @param hasTasks       {@code true}: 任务正在等待被处理
     * @return {@link #SELECT} if the next step should be blocking select
     * {@link #CONTINUE} if the next step should be to not select but rather jump back to the IO loop and try again.
     * Any value >= 0 is treated as an indicator that work needs to be done.
     */
    int calculateStrategy(IntSupplier selectSupplier, boolean hasTasks) throws Exception;
}
